/** Keriosity, ESIR 2
 * 	Manual (Modele): class permettant de gerer le mode manuel: les connections et le mode gyroscope
 *	@author: GOUYET Brett
 *	@date: 15/05/2012
 */

package keriosity.core;

import keriosity.activities.IManualObserver;
import keriosity.connection.BluetoothConnection;
import keriosity.connection.IConnection;
import keriosity.connection.WifiManual;
import keriosity.gyroscope.Gyroscope;
import keriosity.gyroscope.IGyroscope;

public class Manual implements IManual {
	private static String URL_MANUAL_CONTROL = ":8080/kercar_serveur/manualControl";
	
	protected IConnection _connectionCommand = null; //connecteur qui va nous permettre d'envoyer des ordres
	protected IGyroscope _manualSensor = null;
	protected IManualObserver _manualObserver = null;
	protected boolean _modeGyroscope = false;
	
	protected int _upOpacite = 255;
	protected int _downOpacite = 120;
		
	
	/** CONTROLEUR **/
	public Manual(IManualObserver manualObserver, boolean modeGyroscope){
		
		_modeGyroscope = modeGyroscope;
		_connectionCommand = new WifiManual("48.60.13.105:8080/kercar_serveur/manualControl"); //par defaut on initialise en wifi	
		_manualObserver = manualObserver;
		
		if(_modeGyroscope)
			_manualSensor = new Gyroscope(this, _manualObserver.getContext()); //on cree le sensor
	}
	
	
	/** Methode permettant de se connecter en Bluetooth
	 * 
	 * @param name: nom du peripherique (robot)
	 * @return true si on a reussit, false sinon
	 */
	public boolean connectWithBluetooth(String name){
		
		disconnect(); //par defaut on se deconnecte
		
		_connectionCommand = new BluetoothConnection(); //on se met en bluetooth	
		
		return _connectionCommand.connect(name); //on se connecte
	}
	
	
	/** Methode permettant de se connecter en Wifi
	 * 
	 * @param name: nom du peripherique (robot)
	 * @return true si on a reussit, false sinon
	 */
	public boolean connectWithWifi(String name){
		
		disconnect();  //par defaut on se deconnecte (si on passe du bluetooth au wifi)
		
		_connectionCommand = new WifiManual(name + URL_MANUAL_CONTROL); //on se met en wifi	        		
		        		
		return _connectionCommand.connect(name); //on se connecte   
	}
	
		
	/** Methode envoyant un ordre a notre connexionCommand
	 * 
	 * @param ordre : ordre a envoyer
	 * @return -1 si on erreur durant l'envoi, 1 si on est pas connecte, 
	 * 0 si ca a bien envoye
	 */
	public int send(String ordre){
		
		//on envoi l'ordre et on traite les erreurs
		if(! _connectionCommand.send("?ordre=" + ordre)){			
	
			if(_connectionCommand.isConnected())
				return -1; //"Error during sending order"
			else
				return 1; //"Not connected" 
		}
		return 0; //pas d'erreur
	}
	
	
	/** Methode permettant de se deconnecter **/
	public void disconnect(){
		send("e"); //avant de se deconnecter, on s'arret
		activateSensor(false);
		_connectionCommand.disconnect(); 
	}
	
	
	/** Methode activant ou non le sensor **/
	public void activateSensor(boolean activate){
		
		if(_modeGyroscope){
			_manualSensor.activateSensor(activate);
			
			if(_manualSensor.isActived())
				_manualObserver.setOpaqueMovingBouttons(_downOpacite);
			else
				_manualObserver.setOpaqueMovingBouttons(_upOpacite);
		}
	}


	public boolean isSensorActivated() {
		if(_modeGyroscope)
			return _manualSensor.isActived();
		return false;
	}
	
	
	public void gyroMove(){
		_manualObserver.setOpaqueMovingBouttons(_downOpacite);
		_manualObserver.setOpaqueMove(_upOpacite);
		send("z");	
	}
	
	public void gyroStop(){
		_manualObserver.setOpaqueMovingBouttons(_downOpacite);
		_manualObserver.setOpaqueStop(_upOpacite);
		send("e");	
	}
	
	public void gyroRight(){
		_manualObserver.setOpaqueMovingBouttons(_downOpacite);
		_manualObserver.setOpaqueRight(_upOpacite);
		send("d");
		
	}
	
	public void gyroBack(){
		_manualObserver.setOpaqueMovingBouttons(_downOpacite);
		_manualObserver.setOpaqueBack(_upOpacite);
		send("s");
	}
	
	public void gyroLeft(){
		_manualObserver.setOpaqueMovingBouttons(_downOpacite);
		_manualObserver.setOpaqueLeft(_upOpacite);
		send("q");		
	}
}
